home *** CD-ROM | disk | FTP | other *** search
/ Developer Helper 1: Phil & Dave's Excellent CD / Excellent CD HFS.raw / Moof / Goodies / DTS Goodies / IM's Hacks / Marquee Project / marquee.c < prev    next >
Text File  |  1989-04-14  |  3KB  |  146 lines

  1. /*
  2. ** MPW 3.0 C source to marquee!
  3. */
  4.  
  5. #include <QuickDraw.h>
  6. #include <Events.h>
  7. #include <Fonts.h>
  8. #include <Menus.h>
  9. #include <Windows.h>
  10. #include <Packages.h>
  11.  
  12. Resume() {
  13.     ExitToShell();
  14. }
  15.     
  16. main () {
  17.     auto    EventRecord        event;
  18.     auto    WindowRecord    window;
  19.     auto    Rect            bounds,
  20.                             rect;
  21.     auto    Point            start;
  22.     
  23.     /*
  24.     ** initialize the macintosh
  25.     */
  26.     InitGraf((Ptr) &qd.thePort);
  27.     InitFonts();
  28.     InitWindows();
  29.     InitMenus();
  30.     TEInit();
  31.     InitDialogs((ResumeProcPtr) Resume);
  32.     InitCursor();
  33.         
  34.     SetRect(&bounds, 50, 50, 500, 300);
  35.     NewWindow((Ptr)&window, &bounds, "\pApple Computer Inc.", true, noGrowDocProc, (WindowPtr)-1L, false, 0L);
  36.     SetPort((GrafPtr)&window);
  37.     
  38.     SetRect(&rect, 0, 0, 0, 0);
  39.     while (true) {
  40.         GetNextEvent(everyEvent, &event);
  41.         switch (event.what) {
  42.             case mouseDown :
  43.                 start = event.where;
  44.                 GlobalToLocal(&start);
  45.                 TrackMarquee(start, &rect);
  46.                 break;
  47.             case keyDown :
  48.                 ExitToShell();
  49.                 break;
  50.         }
  51.     }
  52. }
  53.  
  54. /*
  55. ** Description
  56. **        TrackMarquee will display a marquee similar to the 
  57. **        selection rectangle tool in MacPaint™. It is assumed that the
  58. **        current port has been set before calling. 
  59. **
  60. ** Parameters
  61. **        start        : the local coordinates where the mouse down occured.
  62. **        resultRect    : the final rectangle that was selected.
  63. */
  64.  
  65. #define    TICKDELAY    2
  66.  
  67. TrackMarquee(start, resultRect)
  68.     Point    start;
  69.     Rect    *resultRect;
  70. {    
  71.     /*
  72.     ** there are eight patterns defined here 
  73.     ** each one eight bytes long starting at :
  74.     ** patterns[0], patterns[1], patterns[2], patterns[3],
  75.     ** patterns[4], patterns[5], patterns[6], patterns[7]
  76.     */
  77.     static    unsigned char    patterns[] = {
  78.         0xF8, 0xF1, 0xE3, 0xC7, 0x8F, 
  79.         0x1F, 0x3E, 0x7C, 0xF8, 0xF1, 
  80.         0xE3, 0xC7, 0x8F, 0x1F, 0x3E
  81.     };
  82.     
  83.     auto        Point        mouse;        /* current mouse location */
  84.     register    short        index;        /* index of current patterns array */
  85.     auto        Rect        nowRect,    /* current rectangle to be framed */
  86.                             thenRect;    /* last rectangle to be framed */
  87.     auto        long        nowTicks,    /* current tick count */
  88.                             thenTicks;    /* last tick count */
  89.     auto        Boolean        itsTime;    /* true when TICKDELAY has passed */
  90.     auto        PenState    penState;    /* saved on entry to procedure */
  91.     
  92.     thenTicks = 0;
  93.     index = 0;
  94.     
  95.     GetPenState(&penState);
  96.     PenMode(patXor);
  97.     
  98.     PenPat(&patterns[index]);
  99.     SetRect(&nowRect, start.h, start.v, start.h, start.v);
  100.     FrameRect(&nowRect);
  101.     thenRect = nowRect;
  102.     
  103.     while (StillDown()) {
  104.         GetMouse(&mouse);
  105.         SetMobiusRect(&nowRect, start.h, start.v, mouse.h, mouse.v);
  106.         nowTicks = TickCount();
  107.         if ((thenTicks + TICKDELAY) < nowTicks) {
  108.             itsTime = true;
  109.              thenTicks = nowTicks;
  110.         } else {
  111.             itsTime = false;
  112.         }
  113.         if (itsTime || ! EqualRect(&nowRect, &thenRect)) {
  114.             FrameRect(&thenRect);
  115.             index = index < 7 ? index + 1 : 0;
  116.             PenPat(&patterns[index]);
  117.             FrameRect(&nowRect);
  118.             thenRect = nowRect;
  119.         }
  120.     }
  121.     FrameRect(&thenRect);
  122.     
  123.     SetPenState(&penState);
  124.     *resultRect = thenRect;
  125. }
  126.  
  127. SetMobiusRect(rect, left, top, right, bottom)
  128.     Rect    *rect;
  129.     short    left, top, right, bottom;
  130. {
  131.     if (left > right) {
  132.         rect->left = right;
  133.         rect->right = left;
  134.     } else {
  135.         rect->left = left;
  136.         rect->right = right;
  137.     }
  138.     if (top > bottom) {
  139.         rect->top = bottom;
  140.         rect->bottom = top;
  141.     } else {
  142.         rect->top = top;
  143.         rect->bottom = bottom;
  144.     }
  145. }
  146.